package saei.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import saei.bean.Cpu;
import saei.bean.Licencia;
import saei.bean.Software;
import saei.bean.vo.SoftwareInstaladoVO;
import saei.persistencia.DAO.LicenciaDAO;

public class ServiciosLicencia {
	
	public static Licencia buscarActiva(Software software) {
		return LicenciaDAO.buscarActiva(software);
	}
	
	public static List<Licencia> buscarTodas() {
		return LicenciaDAO.buscarTodas();
	}
	
	public static List<Licencia> buscarActivas() {
		return LicenciaDAO.buscarActivas();
	}
	
	public static List<SoftwareInstaladoVO> obtenerInformeLicenciasEnUso() {
		HashMap<Software, Integer> contadoresSoftware = new HashMap<Software, Integer>();
		for (Software software : ServiciosSoftware.buscarTodos()) {
			contadoresSoftware.put(software, new Integer(0));
		}
		
		List<Cpu> cpuActivas = ServiciosEquipo.buscarCpuActivas();
		for (Cpu cpu : cpuActivas) {
			for (Software software : cpu.getSoftware()) {
				Integer cantidad = contadoresSoftware.get(software);
				cantidad++;
				contadoresSoftware.put(software,cantidad);
			}
		}
		
		List<SoftwareInstaladoVO> listaSoftInstalado = new ArrayList<SoftwareInstaladoVO>();
		for (Software software : contadoresSoftware.keySet()) {
			int cantidadInstalados = contadoresSoftware.get(software);
			SoftwareInstaladoVO softInstalado = new SoftwareInstaladoVO();
			softInstalado.setCantidadInstalados(cantidadInstalados);
			softInstalado.setNombreSoftware(software.getNombre());
			softInstalado.setVersionSoftware(software.getVersion());
			
			Licencia licencia = ServiciosLicencia.buscarActiva(software);
			if (licencia != null) {
				float porcUtilizacion = (cantidadInstalados * 100.0f) / licencia.getCantidadEquipos();
				
				softInstalado.setCantidadMaxima(licencia.getCantidadEquipos());
				softInstalado.setFechaVencimiento(licencia.getFechaCaducidad());
				softInstalado.setNumeroLiencia(licencia.getNumeroSerie());
				softInstalado.setNivelUtilizacion(porcUtilizacion);
			} else {
				softInstalado.setCantidadMaxima(0);
				softInstalado.setFechaVencimiento(null);
				softInstalado.setNumeroLiencia("");
				softInstalado.setNivelUtilizacion(0);
			}
			
			listaSoftInstalado.add(softInstalado);
		}
		
		return listaSoftInstalado;
	}
}
